﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorOutputField.h
 * @brief  Abaqus Output 适配器 用于读取INP过程中的Output解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-04-16
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTOROUTPUTFIELD__H__
#define __FITKABAQUSADAPTOROUTPUTFIELD__H__

#include "FITKAbaqusIOINPAPI.h"
#include "FITKAbaqusAbstractAdaptor.h"
#include "FITKAbaqusGetInterfaceTool.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"
#include "FITK_Interface/FITKInterfaceModel/FITKModelEnum.h"
#include "FITK_Interface/FITKInterfaceStructural/FITKAbaOutputVariables.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(Interface, FITKAbaAbstractStep)
ForwardDeclarNS(Interface, FITKAbaFieldOutput)
ForwardDeclarNS(Interface, FITKComponentManager)
ForwardDeclarNS(Interface, FITKAbstractModelComponent)
ForwardDeclarNS(Interface, FITKAbstractModel)

namespace Interface
{
    // enum class OutputVariablesSelectMode;
    enum MeshSurfaceType;
}
namespace IO
{
    /**
     * @brief Abaqus Output Field 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-26
     */
    class FITKAbaqusIOINPAPI FITKAbaqusAdaptorOutputField : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorOutputField() = default;
        ~FITKAbaqusAdaptorOutputField() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 设置分析步数据
         * @param stepData 分析步
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-18
         */
        void setStepData(Interface::FITKAbaAbstractStep* stepData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptW() override;

    private:

        /**
         * @brief 读取场输出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-15
         */
        bool readField();

        /**
         * @brief 读取Standard类型的可选参数
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool readStandardOptionalParameters();

        /**
         * @brief 读取Explicit类型的可选参数
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool readExplicitOptionalParameters();

        /**
         * @brief 读取Field
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool readStandardField();

        /**
         * @brief 读取Field
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool readExplicitField();

        /**
         * @brief 读取ContactOutput
         * @param line 当前行数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-17
         */
        bool readContactOutput(QString line);

        /**
         * @brief 读取ElementOutput
         * @param line 当前行数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-17
         */
        bool readElementOutput(QString line);

        /**
         * @brief 读取NodeOutput
         * @param line 当前行数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-17
         */
        bool readNodeOutput(QString line);

        /**
         * @brief 读取集成输出
         * @param line
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-19
         */
        bool readIntegratedOutput(QString line);

        /**
         * @brief 读取增量输出
         * @param line 当前行数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-19
         */
        bool readIncrementationOutput(QString line);

        /**
         * @brief 写出Standard类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool writeStandard();

        /**
         * @brief 写出Field
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool writeStandardField();

        /**
         * @brief 写出Explicit类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool writeExplicit();

        /**
         * @brief 写出Field
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool writeExplicitField();

        /**
         * @brief 写出ContactOutput
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-17
         */
        bool writeContactOutput();

        /**
         * @brief 写出ElementOutput
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-17
         */
        bool writeElementOutput();

        /**
         * @brief 写出NodeOutput
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-17
         */
        bool writeNodeOutput();

        /**
         * @brief 写出集成输出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-19
         */
        bool writeIntegratedOutput();

        /**
         * @brief 写出增量输出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-19
         */
        bool writeIncrementationOutput();

        /**
         * @brief 是否选择可以写出的类型
         * @param mode 选择的类型
         * @return 是否可以写出
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-19
         */
        bool isSelectedModelWrite(Interface::FITKAbaOutputVariable::OutputVariablesSelectMode mode);

        /**
         * @brief 获取选择模式 字符串转enum
         * @param str 描述模式的字符串
         * @return Interface::OutputVariablesSelectMode 选择模式枚举
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-18
         */
        Interface::FITKAbaOutputVariable::OutputVariablesSelectMode getSelectedMode(QString str);

        /**
         * @brief 获取getVariable的字符串 通过枚举
         * @param typeModel 模式枚举
         * @return 描述模式的字符串
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-18
         */
        QString getVariableString(Interface::FITKAbaOutputVariable::OutputVariablesSelectMode typeModel);

        /**
         * @brief 设置作用域
         * @param type 描述集合类型的枚举
         * @param str 作用域字符串用于判断作用域
         * @param isExterior 是否外部
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-18
         */
        bool setDomain(Interface::FITKModelEnum::FITKModelSetType type, QString str, bool isExterior);

        /**
         * @brief 通过名称获取时间点ID
         * @param name
         * @param timePointID 返回的时间点ID
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-20
         */
        bool getTimePointNameByID(QString name, int& timePointID);

        /**
         * @brief 通过时间点ID获取名称
         * @param timePointID
         * @param name 返回的名称
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-20
         */
        bool getTimePointIDByName(int ID, QString& name);

		/**
		 * @brief 获取Set名称
		 * @param comp 集合
		 * @param model 模型
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-08-05
		 */
		QString getSetName(Interface::FITKAbstractModelComponent* comp, Interface::FITKAbstractModel* model);

    private:

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-13
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
         * @brief 分析步（Step）数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-18
         */
        Interface::FITKAbaAbstractStep* _stepData{};

        /**
         * @brief 输出数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        Interface::FITKAbaFieldOutput* _outputData{};

        /**
         * @brief 是否显式分析
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool _isExplicit = false;

        /**
         * @brief 获取接口 工具类
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-25
         */
        FITKAbaqusGetInterfaceTool tool;
    };

    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaFieldOutput, FITKAbaqusAdaptorOutputField, 1);

}

#endif